/********************************************************************************
 * Copyright (c)2016-2020, ShenZhen WanJiaAn Technology CO.,LTD.
 * All Rights Reserved.
 *
 * File Name     : DevGpio.c
 * Author        : joki.zhu
 * Date          : 2019-10-16
 *
 * Record        :
 * 1.Date        : 2019-10-16
 *   Author      : joki.zhu
 *   Modification: Created file
 ********************************************************************************/
#include "ProductManager.h"
#include "app_common.h"
#include "hi_hal_gpio_inner.h"

static AV_INT gs_gpioFd = -1;

static int gpio_set_dir(int gpio_map_index, HAL_GPIO_DIR_E enDirVal)
{
    int ret = 0;
    int gpio_id = -1;

    gpio_id = ProductGpioConvert(gpio_map_index);
    if (gpio_id <= 0) {
        return -1;
    }

    ret = HAL_GPIO_SetDir(gs_gpioFd, gpio_id/32, gpio_id%32, enDirVal);
    if (ret < 0) {
        LOGE("HAL_GPIO_SetDir failed\n");
        return -1;
    }
    
    return 0;
}

int GpioInit(void)
{
    AV_INT ret = 0;

    ret = HAL_GPIO_Init(&gs_gpioFd);
    if (AV_FAILURE == ret) {
        LOGE("HAL_GPIO_Init failed\n");
        return AV_FAILURE;
    }

    /* 配置GPIO的复用及方向 */   
    himm(0x120C0010, 0x2);  //PRODUCT_GPIO_SPEAK_ENABLE GPIO1_4
    gpio_set_dir(PRODUCT_GPIO_SPEAK_ENABLE, HAL_GPIO_DIR_WRITE);

    himm(0x120C0000, 0x0);  //PRODUCT_GPIO_INFRAREDLAMP GPIO1_0
    gpio_set_dir(PRODUCT_GPIO_INFRAREDLAMP, HAL_GPIO_DIR_WRITE);

    if (PRODUCT_MODEL_B1 == ProductGetHandle()->ProductModel) {
        himm(0x120C0018, 0x2);  //PRODUCT_GPIO_IRCUT0 GPIO1_6
        gpio_set_dir(PRODUCT_GPIO_IRCUT0, HAL_GPIO_DIR_WRITE);

        himm(0x120C0014, 0x2);  //PRODUCT_GPIO_KEEP_SELF_POWER GPIO1_5 default:0
        gpio_set_dir(PRODUCT_GPIO_KEEP_SELF_POWER, HAL_GPIO_DIR_WRITE);
        GpioReset(PRODUCT_GPIO_KEEP_SELF_POWER);

        himm(0x112C0040, 0x1000);  //PRODUCT_GPIO_RESET_MCU GPIO5_0 default:1
        gpio_set_dir(PRODUCT_GPIO_RESET_MCU, HAL_GPIO_DIR_WRITE);
    } else if (PRODUCT_MODEL_B5 == ProductGetHandle()->ProductModel) {
        himm(0x120C0018, 0x2);  //PRODUCT_GPIO_IRCUT0 GPIO1_6
        gpio_set_dir(PRODUCT_GPIO_IRCUT0, HAL_GPIO_DIR_WRITE);
        
        himm(0x120C0014, 0x2);  //PRODUCT_GPIO_IRCUT0 GPIO1_5
        gpio_set_dir(PRODUCT_GPIO_IRCUT1, HAL_GPIO_DIR_WRITE);

        himm(0x112C0068, 0x0);  //PRODUCT_GPIO_LED_BLUE GPIO6_7
        gpio_set_dir(PRODUCT_GPIO_LED_BLUE, HAL_GPIO_DIR_WRITE);

        himm(0x112C0050, 0x0);  //PRODUCT_GPIO_RESET_MCU GPIO8_6
        gpio_set_dir(PRODUCT_GPIO_RESET_MCU, HAL_GPIO_DIR_WRITE);
    }
    return ret;
}


//GpioGet() 获取GPIO   是否被触发
//参数:  GPIO 数组索引
//返回: 1  已被触发( 光敏检测到白天、按键检测到被按下)
//返回: 0  未被触发 
int GpioGet(int gpio_map_index)
{
    int gpio_id = -1;
    int value = -1;
    int ret = 0;

    gpio_id = ProductGpioConvert(gpio_map_index);
    if (gpio_id <= 0) {
        return -1;
    }
    
    ret = HAL_GPIO_GetBitVal(gs_gpioFd, gpio_id/32, gpio_id%32, &value);
    if (ret < 0) {
        LOGE("HAL_GPIO_GetBitVal failed\n");
        return 0;
    }

    if (ProductGpioTriggerConvert(gpio_map_index) == value) {
        //printf("GpioGet okokokok!\n");
        return 1;
    }

    return 0;
}

//GpioSet()   将GPIO 设置成触发状态
//参数:  GPIO 数组索引
//返回: 0  设置成功 ( LED 亮灯、音频功放开启、夜视灯开启等)
int GpioSet(int gpio_map_index) 
{  
    int gpio_id = -1;

    gpio_id = ProductGpioConvert(gpio_map_index);
    if (gpio_id <= 0) {
        return -1;
    }
    
    if (ProductGpioTriggerConvert(gpio_map_index) == 1) {
        HAL_GPIO_SetBitVal(gs_gpioFd, gpio_id/32, gpio_id%32, 1);
    } else if (ProductGpioTriggerConvert(gpio_map_index) == 0) {
        HAL_GPIO_SetBitVal(gs_gpioFd, gpio_id/32, gpio_id%32, 0);
    } else {
        LOGE("gpio %d trigger convert  error !\n", gpio_id);
    }
    
    return 0;
}

//GpioReset()   将GPIO 设置成非触发状态
//参数:  GPIO 数组索引
//返回: 0  设置成功 ( LED 灭灯、音频功放关闭、夜视灯关闭等)
int GpioReset(int gpio_map_index)
{
    int gpio_id = -1;

    gpio_id = ProductGpioConvert(gpio_map_index);
    if (gpio_id <= 0) {
        return -1;
    }
    
    if (ProductGpioTriggerConvert(gpio_map_index) == 1) {
        HAL_GPIO_SetBitVal(gs_gpioFd, gpio_id/32, gpio_id%32, 0);
    } else if (ProductGpioTriggerConvert(gpio_map_index) == 0) {
        HAL_GPIO_SetBitVal(gs_gpioFd, gpio_id/32, gpio_id%32, 1);
    } else {  
        LOGE("gpio %d trigger convert  error !\n", gpio_id);  
    }
    
    return 0;
}

int GpioDeinit(void)
{
    AV_INT ret = 0;

    ret = HAL_GPIO_Deinit(gs_gpioFd);
    if (AV_FAILURE == ret) {
        LOGE("HAL_GPIO_Deinit failed\n");
        return AV_FAILURE;
    }  

    gs_gpioFd = -1;
    
    return ret;
}

